# coding=utf-8
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from MSB_ERP.apps.erp_system.serializer.dept_serializer import DeptSerializer
from MSB_ERP.utils.base_views import MultipleDestoryMixin
from erp_system.models import DeptModel

from MSB_ERP.utils.pagination import GlobalPagination


class DeptView(viewsets.ModelViewSet, MultipleDestoryMixin):
    '''
        create:
        部门--新增

        部门新增，status：201（成功），return:新增部门信息

        destroy:
        部门--删除单个部门

        部门删除，status：204（成功），return:None

        multiple_delete:
        部门--批量删除

        部门批量删除，status：204（成功），return:None

        update:
        部门--修改，部门本身的信息（属性），不包括授权（关联关系）

        部门修改，status：200（成功），return:修改增部门信息

        partial_update:
        部门--局部修改

        部门局部修改，status：200（成功），return:修改增部门信息

        list:
        部门--获得所有的部门
        请求参数pid：父部门的ID，1.如果没有传pid，则查询所有的部门
                              2.如果pid=0，则查询顶级部门列表
                              3.如果pid=（具体的值）非零，则查询某一个父部门所有子部门列表

        retrieve:
        查询单个部门

        返回单个部门，status：200（成功），return:返回部门
    '''
    queryset = DeptModel.objects.all() # 指明该视图集在查询数据时使用的查询集
    serializer_class = DeptSerializer  # 序列化（指明该视图在进行序列化或反序列化时使用的序列化器）
    pagination_class = GlobalPagination # 分页显示的数据

    # 因为list有三种不同的情况，所以我们不是直接给当前的属性赋值，应该重写函数get_queryset
    def get_queryset(self):
        # 重写序列化的数据
        ''' 是更改返回的数据不易默认的数据的，序列化类字段返回，返回指定的查询集 '''
        # 返回的数据其实就是挂链着list函数
        '''
            1.如果没有传pid，则查询所有的部门
            2.如果pid=0，则查询顶级部门列表
            3.如果pid=（具体的值）非零，则查询某一个父部门所有子部门列表
        '''
        ''' 
            request.query_params主要是适用于GET的请求的
            request.data适用于POST、PUT等请求的 
        '''
        pid = self.request.query_params.get('pid',None)
        if pid:
            integer_pid = int(pid)
            # 第2种情况，查询顶级部门
            if integer_pid == 0:
                # parent__isnull判断属性为空，这个属性必须特殊，他是关联属性（关联对象），所以要加双下划线
                return DeptModel.objects.filter(parent__isnull=True).all()
            # 第3种情况，pid=具体的值
            else:
                return DeptModel.objects.filter(parent__id=integer_pid).all()
        else: # 查询所有的部门列表
            # 第1种情况，没有传pid
            return DeptModel.objects.all()


